// SysEnv.h
#ifndef SYSENV_H
#define SYSENV_H

#include <QObject>
#include <QSettings>
#include <QString>
#include <QJsonObject>

#include <AlgManager/DataX.h>
#include <DeviceManager/types.h>

// 配置源枚举
enum class ConfigSource {
    IniFile,    // INI文件
    Database    // 数据库
};

// 默认配置值
const QString DEFAULT_SERVER_IP = "192.169.100.1";
const int DEFAULT_SERVER_PORT = 9600;
const QString DEFAULT_THEME = "Light";
const QString DEFAULT_IMAGE_SAVE_PATH = "";

/* ---------- 仅运行时 ---------- */
struct RuntimeOnly {
    quint8 initMask = 0xFF;
    bool   running  = false;
    ConfigSource algorithmSource = ConfigSource::Database; // 当前算法参数来源
};

/* ---------- 需要持久化 ---------- */
struct Persistent {
    QString serverIP   = DEFAULT_SERVER_IP;
    int     serverPort = DEFAULT_SERVER_PORT;
    QString theme      = DEFAULT_THEME;
    QString imageSavePath = DEFAULT_IMAGE_SAVE_PATH;

    // 使用DataX.h中定义的数据结构
    s_PreProcess3DSPara preProcessPara;
    s_DefectPlateBPara defectPara;
    s_JggyPara pathPara;
    s_PoseH cameraToRobotPose;

    ProcessParams processParams;

    // 数据库参数配置
    bool useDatabaseParams = true; // 是否使用数据库参数
};

class SysEnv : public QObject
{
    Q_OBJECT
public:
    static SysEnv& instance();

    enum Module { M_CAM = 0x01, M_PLC = 0x02, M_DB = 0x04, M_ALG = 0x08 };

    /* 访问接口 */
    RuntimeOnly& rt()   { return m_rt; }
    Persistent&  cfg()  { return m_cfg; }
    const Persistent& cfg() const { return m_cfg; }

    /* 配置管理 */
    void setConfigInAppDir(const QString& relativePath = "configs/app_config.ini");
    void setIniPath(const QString& absoluteFilePath);
    void load();
    void save();

    /* 数据库参数管理 - 简化接口 */
    bool loadAlgorithmParamsFromDatabase();
    bool saveAlgorithmParamsToDatabase();
    QJsonObject getAlgorithmParamsJson() const;
    ConfigSource getCurrentAlgorithmSource() const { return m_rt.algorithmSource; }

    /* 工艺参数数据库管理 */
    bool loadProcessParamsFromDatabase();
    bool saveProcessParamsToDatabase();
    QJsonObject getProcessParamsJson() const;

    /* 运行状态管理 */
    void setRunning(bool on);
    bool isRunning() const { return m_rt.running; }

    /* 图像保存路径管理 */
    QString getImageSavePath() const;
    void setImageSavePath(const QString& path);

    /* 模块状态管理 */
    void setModuleOk(quint8 bit)  { setBit(bit, false); }
    void setModuleBad(quint8 bit) { setBit(bit, true);  }
    quint8 initMask() const { return m_rt.initMask; }

    /* 配置验证 */
    bool isConfigValid() const;

signals:
    void cfgChanged();
    void runningChanged(bool running);
    void initDone(quint8 mask);
    void algorithmParamsLoaded(bool success, const QString& message);
    void algorithmSourceChanged(ConfigSource source);

    // 添加工艺参数加载信号
    void processParamsLoaded(bool success, const QString& message);

private:
    explicit SysEnv(QObject* parent = nullptr);
    ~SysEnv() = default;
    SysEnv(const SysEnv&) = delete;
    SysEnv& operator=(const SysEnv&) = delete;

    void setBit(quint8 bit, bool bad);
    void resetToDefaults();

    // 数据库参数解析方法
    bool parseAlgorithmJson(const QJsonObject& json);
    bool parseProcessParamsJson(const QJsonObject& json);
    QJsonObject algorithmParamsToJson() const;

    RuntimeOnly m_rt;
    Persistent  m_cfg;
    QSettings*  m_ini;
    QString     m_iniPath;
    QJsonObject m_algorithmJson; // 缓存的算法参数JSON
};

#endif // SYSENV_H
